﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace appBarquitos.logicaNegocio
{
    public static class barquito
    {
        /// <summary>
        /// Realiza la descargar del barco
        /// </summary>
        /// <param name="barcos"> todos los barcos</param>
        /// <param name="puertos"> todos los puertos</param>
        /// <returns>mensaje final</returns>
        public static  Queue<string> descargar(Queue<Stack<int>> barcos, List<int>puertos)
        {
            //Almacena los mensajes que se mostraran como resultado
            Queue<string> mensaje = new Queue<string>();

            //variable para almacenar el número de puertos
            int cantPuertos=puertos.Capacity;
            //Número del barco
            int numBarco = 1;
            //Tiempo de entrda del barco
            int entrada = 1;
            //Tiempo de salida del barco
            int salida = 1;

            //Realiza el ciclo mientras queden barcos
            do
            {
                //realiza ciclo según la cantidad de puertos
                for (int i = 1; i < cantPuertos; i++ )
                {
                    //Extrae los containers del barco
                    Stack<int> containers = barcos.Peek();
                    //variable para almacenar el número de containers del barco
                    int cantContainer = containers.Count;
                    //variable para almacenar el tiempo de demora del barco en el proceso de descarga
                    int tiempoBarco = 0;
                    //descarga el barco
                    for (int t = 1; t <= cantContainer; t++)
                    {
                        tiempoBarco += containers.Pop();
                    }

                    //suma un tiempo de salida al barco
                    tiempoBarco += salida;
                    
                    //calcula el tiempo en el que se fue el barco
                    int tiempo = puertos.Min() + tiempoBarco;
                    
                    //agregar tiempo de entrada y salida del barco a los mensajes finales
                    mensaje.Enqueue("El barco " + numBarco + " llegó en el tiempo " + puertos.Min() + " y se fue en el tiempo " + tiempo);
                    
                    //Agrega tiempo de entrada del siguiente barco
                    tiempo += entrada;
                    //saca al barco de la cola
                    barcos.Dequeue();
                    //aumenta el número del barco
                    numBarco += 1;
                    
                    //si hay n puertos desocupados hace pasar a uno primero
                    if (puertos.Contains(tiempo))
                    {
                        puertos.Add(tiempo + 1);
                    }
                        //Pasa al puerto desocupado
                    else
                    {
                        puertos.Add(tiempo);
                    }
                    //Saca el tiempo del último barco
                    puertos.Remove(puertos.Min());

                    //Rompe el ciclo si no quedan barcos
                    if (barcos.Count == 0)
                    {
                        break;
                    }
                }
            }while(barcos.Count >0);

            return mensaje;
        }
    }
}
